[Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

1. [Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

Alex Fernando Ferreira
staltux

(usa Slackware)

Enviado em 24/12/2010 - 15:09h

olá pessoal, tenho um codigo aqui fazendo testes com ponteiro, fiz uma coisa que não deveria pelo que aprendi sobre ponteiros...porem o codigo funciona, ainda sim, acredito estar fazendo mau uso, e gostaria de saber as implicações disso.Segue o codigo bem simples:

int *c;// declara o dito
c = (int *)malloc(sizeof(int));// reserva espaco de memoria para a variavel
*c = 10;// atribui valor onde o ponteiro aponta...ok
printf("%i\n",*c);// exibe o valor...ok
c++;// obs 1
*c = 20;// obs 2
printf("%i\n",*c);
c++;
*c = 30;
printf("%i\n",*c);
printf("Voltando...\n");
printf("%i\n",*c);
c--;
printf("%i\n",*c);
c--;
printf("%i\n",*c);
// fim

obs 1: pelo que aprendi, fazer c++ quando c é um ponteiro, incrementa sua localização,ou seja
se c apontava para um endereco 162066464, sera somado o tamanho de um int, e ele passara a apontar para 162066468.

obs 2:até ai tudo bem, o problema e que eu atribui um valor para este endereço de memoria sem ter declarado antes, isso não deveria dar um "access violation" ou qualquer coisa do tipo,já que estou a usar um endereço que não foi previamente requisitado?

neste exemplo tanto o encremento quanto o decremento funcionaram perfeitamente exibindo os valores corretos...


  


2. MELHOR RESPOSTA

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 25/12/2010 - 13:29h

Oi Alex,

A sua questão é pertinente. Na vida real, o que acontece em nível máquina é muito mais complexo do que aquilo abordado em livros de programação.

A alocação de memória não é tão simples como reservar 4 bytes de memória para um inteiro e seguir adiante, isso é algo que depende fortemente da arquitetura da CPU. Ainda em um tom bem superficial, saiba que geralmente (para não dizer sempre) os blocos de memória são maiores do que o necessário.

Falhas de segmentação ocorrem ao acessar memória não reservada: Faça você mesmo o teste para imprimir os endereços de apontamento e notará que a sua primeira observação está certa. Substitua "c++;" por "c = c + 1000;" e a famigerada messagem "Segmention fault" provavelmente irá aparecer.

Abraço!

3. Re: [Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 24/12/2010 - 17:29h

Olá,

Bom, tu alocar uma região e usar além da conta o C, pode até permitir, mas não foi à área previamente alocado, você está invadindo uma área que não foi destinada aquilo. Ser possível não significa ser o ideal, ou uma boa prática.

Abraços e Boas Festas


4. ponteiros são perigosos

Alex Fernando Ferreira
staltux

(usa Slackware)

Enviado em 25/12/2010 - 14:06h

f_Candido:

Eu estava quase caindo na besteira de achar isto "normal", como meio de burlar a parte chata de alocação de memoria ^^

julio_hoffimann:

hum,estes blocos de memorial maiores que o necessario me fazem pensar em duas coisas:

1 - a importancia de usar free, já que alem de liberar a memoria que foi utilizada, deve liberar esta parte "extra" do bloco certo?

2 - o problema de se esbajar memoria nos programas, ja que quando aloco variaveis atoa,(tipo um long pra guardar um numero de telefone), alem da memoria esperada, ainda de quebra se aloca um pedaço mais inutil ainda.

não que eu use realmente um long pra isso, mas com os pcs cada vez mas [*****]ços de hoje, não duvido nada que alguns programadores não estão nem ai pra estes detalhes.

Outro problema, neste caso o "Segmention fault" ocorre quando realmente estrapolamos, mas errinhos as vezes imperceptives como o caso do c++, passa batido,e deve dar mô dor de cabeça pra achar,principalmente para programadores inesperientes como é o meu caso...

Por essas e outras que digo: ponteiros são perigosos...mas são bem legais ^^



5. Aula de ponteiros em C

Rogério Lima
rogeriohenrique

(usa Ubuntu)

Enviado em 10/11/2011 - 10:27h

Dá uma olhada nessa aula: http://www.youtube.com/watch?v=rvqQppYo7YU






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts